#ifndef PLANT_H
#define PLANT_H

#ifndef OBJECT_H
#include "Object.h"
#endif

#ifndef KALENDAR_H
#include "Kalendar.h"
#endif

//class Plant
//class orangtua dari semua jenis tanaman di game
//SELALU CEK APAKAH TANAMAN UDAH MATI??
//	integer plant_id	
//		variabel integer menandakan jenis tumbuhan
//		plant_id baru diinisialiasi ketika objek kelas turunan diciptakan
//	constant integer tingkat_dewasa
//		konstanta integer penanda tumbuhan menjadi tingkat dewasa
//	integer tingkat_panen
//		variabel integer penanda tumbuhan menjadi siap panen
//		tingkat_panen tidak konstan, untuk tanaman yang bisa dipanen lebih
//		dari sekali, tingkat_panen terus berkurang
//	constant boolean repanenable
//		konstanta boolean bernilai true jika tumbuhan dapat 
//		dipanen lebih dari sekali atau tidak
//	constant integer musim_tumbuh
//		konstanta integer penanda musim apa tumbuhan tersebut dapat tumbuh
//		bernilai 0 jika tumbuh di musim kemarau, 1 jika musim hujan
//	integer umur
//		variabel integer. Jika mencapai 0. Tanaman mati
//		umur HARUS lebih besar nilainya daripada tingkat_panen!!
//		umur berkurang tiap hari jika umur>0
//	boolean iswatered
//		iswatered bernilai false ketika objek pertama kali diciptakan.
//		berubah menjadi true jika disiram oleh player hari itu
//		iswatered kembali bernilai false jika hari berganti
//	integer happy_meter
//		happy_meter bertambah tiap hari. Variabel ini menjadi indikator
//		apakah tanaman tersebut masih bibit, sudah dewasa, ataupun siap 
//		panen
//	integer x,y
//		Posisi tanaman terdiri dari dua variabel integer yaitu int x, int y
//		menandakan posisi plant di game	
class Plant:public Object {
	protected:
	const int plant_id;
	const int tingkat_dewasa;
	int tingkat_panen;
	const bool repanenable;
	const int musim_tumbuh; 
	int umur;
	bool iswatered;
	int happy_meter;
	int x;
	int y;
	
	public:
	
	//integer getObjectType 
	//	mengembalikan tipe object(kode tanaman 3)
	int getObjectType() const;
	
	//constructor
	Plant(int,int,int,bool,int,int);
	
	//void SetX
	//	set location.x = new_x
	void SetX(int);
	
	//void SetY
	//	set location.y = new_y	
	void SetY(int);
	
	//void GetX
	//	set location.x = new_x
	int GetX() const;
	
	//void GetY
	//	set location.y = new_y	
	int GetY() const;
	
	//integer GetMusim_tumbuh()
	//	bernilai 0 jika tumbuhan ini hanya dapat tumbuh di musim kemarau
	//	bernilai 1 jika tumbuhan ini hanya dapat tumbuh di musim hujan
	int GetMusimTumbuh() const; 
	
	//void SetUmur(int a)
	//	set umur tanaman
	void SetUmur(int);
	
	//integer GetUmur()
	//	mengembalikan umur tanaman
	int GetUmur() const;
	
	//integer GetPlantId()
	//	mengembalikan id tanaman
	int GetPlantId() const;
	
	//void SetHappyMeter(int a)
	//	set happy_meter tanaman
	void SetHappyMeter(int);
	
	//integer GetHappyMeter()
	//	mengembalikan nilai happy_meter tanaman
	int GetHappyMeter() const;
	
	//integer GetTingkatDewasa()
	int GetTingkatDewasa() const;
	
	//integer GetTingkatPanen()
	int GetTingkatPanen() const;
	
	//integer SetTingkatPanen(int)
	void SetTingkatPanen(int) ;
	
	//void SetWatered(bool)
	void SetWatered(bool);
	
	//boolean isWatered()
	//	Fungsi isWatered() harus diimplementasikan di kelas anak
	//	isWatered mengembalikan nilai true jika tanaman sudah disiram
	bool isWatered() const;
	
	//boolean isSeed()
	//	Fungsi isSeed() harus diimplementasikan di kelas anak
	//	isSeed mengembalikan nilai true jika happy_meter < tingkat_dewasa(ada di kelas anak) 
	bool isSeed() const;
	
	//boolean isMature()
	//	Fungsi isMature() harus diimplementasikan di kelas anak
	//	isMature() mengembalikan nilai true 
	//	jika happy_meter >= tingkat_dewasa(ada dikelas anak) && happy_meter < tingkat_panen(ada dikelas anak)
	bool isMature() const;
	
	//boolean isHarvest()
	//	Fungsi isHarvest() harus diimplementasikan di kelas anak
	//	isHarvest() mengembalikan nilai true 
	//	jika happy_meter > tingkat_panen(ada di kelas anak) artinya tanaman siap dipanen
	bool isHarvest() const;
	
	//boolean isRepanenable()
	//	Fungsi isRepanenable() mengembalikan nilai true jika tanaman bisa dipanen
	//	lebih dari sekali
	//	UNTUK TANAMAN YANG BISA DIPANEN BERKALI2, KURANGI TITIK PANENNYA SETIAP KALI DIPANEN!!!
	bool isRepanenable() const;
	
	//boolean isMati()
	//	Fungsi isMati() mengembalikan nilai true jika tanaman mati(umur==0)
	//	Umur tanaman TIDAK lagi berkurang jika sudah mati
	//	Happy meter tanaman TIDAK lagi bertambah jika sudah mati
	bool isMati() const;
	
	//abstract void watered()
	//	Tanaman disiram, jika iswatered==false, naikkan happy_meter(berapa besar kenaikannya ditentukan di kelas anak)
	//	jika iswatered==true, tidak ada perubahan
	virtual void watered()=0;
	
	//abstract void harvested()
	//	Tanaman dipanen, jika repanenable==true, kurangi tingkat_panen(berapa besar penurunannya ditentukan di kelas anak)
	//		minimum penurunan sama dengan tingkat_dewasa
	//	jika repanenable==false, ubah tanaman menjadi mati(umur=0)
	virtual void harvested()=0;
	
	//Void grow()
	//	fungsi grow() adalah fungsi untuk menumbuhkan tanaman
	//	Cek terlebih dahulu apakah musim cocok untuk tanaman?
	//		jika iya,lakukan:
	//		umur--(kecuali kalo udah mati)
	//		iswatered=false
	//		
	void grow();

	
};
#endif
